package com.sky.seata.order.util;

import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.*;
import org.springframework.util.ResourceUtils;

import java.io.*;
import java.util.Properties;
import java.util.Set;

public class ZookeeperUtil {
    // 根节点
    private static final String ROOT_PATH = "/seata";
    private static final String ZOOKEEPER_ADDR = "192.168.31.2:2181,192.168.31.2:2182,192.168.31.2:2183";
    private static final String FILE_PATH = "/Volumes/Andy/Sky/sky-trunk/seata-trunk/config.txt";


    public static void register(String serviceName, byte[] value) {
        ZkClient zkClient = new ZkClient(ZOOKEEPER_ADDR);//创建zookeeper的java客户端连接
        if(!zkClient.exists(ROOT_PATH)) {
            zkClient.createPersistent(ROOT_PATH);
        }
        String servicePath = ROOT_PATH + "/" + serviceName;
        if (!zkClient.exists(servicePath)) {
            zkClient.createPersistent(servicePath);
            zkClient.writeData(servicePath, value);
        }


    }

    public static void deleteNode(String servicePath){
        ZkClient zkClient = new ZkClient(ZOOKEEPER_ADDR);
        zkClient.delete(servicePath);
    }

    /**
     *
     * @param dataId
     * @param content
     * @return
     */
    public static void putConfig(String dataId, String content) {
        ZkClient zkClient = new ZkClient(ZOOKEEPER_ADDR);//创建zookeeper的java客户端连接
        if (!zkClient.exists(ROOT_PATH)) {
            zkClient.createPersistent(ROOT_PATH);
        }
        // 设置序列化，保证不会出现乱码
        zkClient.setZkSerializer(new MyZkSerializer());
            String path = ROOT_PATH + "/" + dataId;
        if (!zkClient.exists(path)) {
            // 参数1： 注册的路径/seata/xxxxx
            // 参数2： 注册的路径对应的value
            // 参数3： 权限设置
                            // OPEN_ACL_UNSAFE: 完全放开，任何连接的客户端都有权限操作该属性znode
                            // CREATOR_ALL_ACL: 只有创建者才有ACL权限
                            // READ_ACL_UNSAFE: 只能读取ACL
            // 参数4： 目录节点方式
                    // PERSISTENT  持久化目录节点，存储的数据不会丢失。
                    // PERSISTENT_SEQUENTIAL 顺序自动编号的持久化目录节点，存储的数据不会丢失，
            //                    并且根据当前已近存在的节点数自动加 1，然后返回给客户端已经成功创建的目录节点名。
                    // EPHEMERAL 临时目录节点，一旦创建这个节点的客户端与服务器端口也就是session 超时，
            //                      这种节点会被自动删除。
                    // EPHEMERAL_SEQUENTIAL 临时自动编号节点，一旦创建这个节点的客户端与服务器端口也就是session 超时，
            //                      这种节点会被自动删除，并且根据当前已近存在的节点数自动加 1，
            //                      然后返回给客户端已经成功创建的目录节点名。
            String zk = zkClient.create(path, content, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        } else {
            zkClient.writeData(path, content);
        }
    }

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException{

        //putConfig("test1", "fdsafdsa");

        /*ZkClient zkClient = new ZkClient(ZOOKEEPER_ADDR);
        zkClient.setZkSerializer(new DefaultZkSerializer());
        Object object = zkClient.readData("/seata/test4");
        System.out.println(object.toString());*/

        //获取key对应的value值
        Properties properties = new Properties();
        // 使用ClassLoader加载properties配置文件生成对应的输入流
        // 使用properties对象加载输入流
        try {
            File file = ResourceUtils.getFile("classpath:zk-config.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
            Set<Object> keys = properties.keySet();//返回属性key的集合
            for (Object key : keys) {
                //deleteNode(ROOT_PATH + "/" + key.toString());
                putConfig(key.toString(), properties.get(key).toString());
            }
            //deleteNode(ROOT_PATH);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
